﻿using Dashboard.Common;
using Dashboard.Model;
using Dashboard.Param;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows;

namespace Dashboard.ViewModel
{
    /// <summary>
    /// 需要修改类的访问权为：public
    /// 为了能够绑定命令，所以需要一个基础的命令类（建在Common里）
    /// 
    /// 为了窗口能够调用到本ViewModel中的方法，需要在LoginView的cs代码中，关联数据上下文
    /// </summary>
    public class LoginViewModel
    {
        /// <summary>
        /// 关闭按钮的命令
        /// </summary>
        public CommandBase CloseWindowCommand { get; set; }
        /// <summary>
        /// 与本视图关联的Model的对象（绑定到View的属性时也是绑定的对象名而不是类名）
        /// </summary>
        public LoginModel loginModel { get; set; } = new LoginModel();
        /// <summary>
        /// 登录按的命令
        /// </summary>
        public CommandBase LoginButtonCommand { get; set; }

        public LoginViewModel()
        {
            loginModel.ShowProgress = Visibility.Collapsed;
            /// 构造窗口时实例化一个命令
            this.CloseWindowCommand = new CommandBase();
            /// 设置该命令执行关闭窗口动作
            this.CloseWindowCommand.DoExecute = new Action<object>((o) =>
            {
                /// 因为LoginView的关闭按钮绑定的命令参数是来自Window标签，所以这里可以将o转成Window类型的对象，然后就可以调用这个对象的Close方法来实现关闭窗口的效果了
                (o as Window).Close();
            });
            /// 设置该命令在任何条件下都可以触发（只要是点击了关闭按钮调用了该命令都可以触发关闭动作）
            this.CloseWindowCommand.DoCanExecute = new Func<object, bool>((o) =>
            {
                /// 关闭按钮总是可以被点击触发的
                return true;
            });


            /// 构造登录按钮点击触发的命令
            this.LoginButtonCommand = new CommandBase();
            LoginButtonCommand.DoCanExecute = new Func<object, bool>((o) =>
            {
                return true;
            });
            /// 绑定登录按钮触发时执行的委托（DoLogin)也可以同关闭按钮一样写成lambda表达式的形式
            LoginButtonCommand.DoExecute = new Action<object>(DoLogin);

            /// 实例化Model（编码时为了测试绑定是否成功所以进行的构造方法内赋初值，但正是使用的话，就不能在这里赋初值了，在成员变量的定义处直接new一个对象）
            //this.loginModel = new LoginModel();

            //this.loginModel.UserName = "shenjie";
            //this.loginModel.ValidationCode = "0000";
            //this.loginModel.Password = "12345";
        }

        private void DoLogin(object obj)
        {
            this.loginModel.ShowProgress = Visibility.Visible;
            this.loginModel.ErrorMessage = "";
            /// 登录按钮点击时真正执行的逻辑
            if (string.IsNullOrEmpty(loginModel.UserName))
            {
                this.loginModel.ErrorMessage = "请输入用户名";
                this.loginModel.ShowProgress = Visibility.Collapsed;
            }
            else if (string.IsNullOrEmpty(loginModel.Password))
            {
                this.loginModel.ErrorMessage = "请输入密码";
                this.loginModel.ShowProgress = Visibility.Collapsed;
            }
            else if (string.IsNullOrEmpty(loginModel.ValidationCode))
            {
                this.loginModel.ErrorMessage = "请输入验证码";
                this.loginModel.ShowProgress = Visibility.Collapsed;
            }
            else if (loginModel.ValidationCode != "1234")
            {
                this.loginModel.ErrorMessage = "验证码错误";
                this.loginModel.ShowProgress = Visibility.Collapsed;
            }
            else
            {
                Task.Run(new Action(()=>
                {
                    Thread.Sleep(3000);
                    //string result = HttpTool.RequestByPost("http://localhost:8888/studyWpf/login", new LoginParam()
                    string result = HttpTool.RequestByPost("http://google.com.pk", new LoginParam()
                    {
                        account = loginModel.UserName,
                        password = loginModel.Password
                    });
                    Console.WriteLine("响应：" + result);
                    this.loginModel.ShowProgress = Visibility.Collapsed;
                }));
            }
            
        }
    }
}
